#include <stdio.h>
#include <modbus.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/msg.h>
#include <sqlite3.h>
#include "cJSON.h"
#include "shmem.h"
#include "msg_queue_peer.h"
#include <semaphore.h>

#define MAX_NODE 128                            // 最大支持节点数目，实际可用是127
#define STD_NODE_LEN sizeof(modbus_set_t)       // 每个节点的标准长度
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN) // 最大共享内存大小
#define _PATH "/home/hq/c/config/project.json"

typedef struct msgbuf // 消息队列数据结构
{
    long mtype;
    int mkey;
    char value[16];
    int addr;
} msgbuf_t, *msgbuf_p;

typedef union val // 值类型联合体
{
    int b_val;   // bool类型存储空间
    int i_val;   // 整形值存储空间
    float f_val; // 浮点值存储空间
} val_t;

typedef struct modbus_set // Modbus数据点设置结构体
{
    int key;       // 数据点标识符
    int type;      // 数据点类型
    int dev_type;  // 数据点属于哪个设备，根据网关支持的设备自行定义
    val_t old_val; // 变化上报后需要更新旧值
    val_t new_val; // 从共享内存取出最新数据，放到new_val中
    int ret;       // 默认为-1，采集成功后设置为0，采集失败再置-1
    char name[32]; // 数据点名称
    int addr;      // 寄存器地址
} modbus_set_t, *modbus_set_p;

enum
{
    TYPE_INT = 1,
    TYPE_BOOL,
    TYPE_FLOAT
};